package innerclass05;
/*
* 匿名内部类:new 父类接口或父类(){
*       //重写父类或父接口的方法
* };
*匿名内部类的原理:
*   编译器会在编译内部类时完成以下操作:
*       1.会生成一个内部类Demo02$1.class
*      相当于Demo02$1.class implements Smoke{
*              public void smoking() {
*                 System.out.println("饭后一根烟,赛过活神仙!");
*          }
* }
2.会自动创建Demo02$1这个类的对象
 *       new Demo02$1();
 *
 *        Smoke s = new Smoke() { //相当于 Smoke s = new Demo02$();
 *             @Override
 *             public void smoking() {
 *                 System.out.println("饭后一根烟,赛过活神仙!");
 *             }
 *         };
 *      最终相当于:
 *        class Demo02$1 implements Smoke{
 *            public void smoking() {
 *                    System.out.println("饭后一根烟,赛过活神仙!");
 *             }
 *         }
 *        Smoke s = new Demo02$1(); //父接口指向实现类对象(多态)
 *        s.smoking();
 *  匿名内部类的作用就是为了简化代码
 */
public class Demo02 {
    public static void main(String[] args) {
       Smoke s = new Smoke(){

            @Override
            public void Smoking() {
                System.out.println("饭后一支烟，赛过活神仙！");
            }
        };
        s.Smoking();
/*        new Smoke(){
            @Override
            public void Smoking() {
                System.out.println("饭后一支烟，赛过活神仙！");
            }
        }.Smoking();*/
        //1.验证s引用指向对象使用的类是匿名内部类Demo02$1
        System.out.println(s.getClass());//class innerclass05.Demo02$1

        //2.验证匿名内部类Demo02$1实现的父接口为smoke
        System.out.println(s.getClass().getInterfaces()[0]);//interface innerclass05.Smoke

        //3.验证s指向的是匿名内部类对象 //Smoke s = new Demo02$1();
        System.out.println(s);//innerclass05.Demo02$1@4e50df2e

    }
}
